package mobile

import (
	"encoding/xml"
	"fmt"

	utils "bserver/pkg/utils"
)

// Request 结构体定义了请求包的格式
type Request struct {
	XMLName xml.Name    `xml:"Request"` // XML根元素名称
	PKType  PKType      `xml:"PK_Type"` // PK类型信息
	Info    interface{} `xml:"Info"`    // 请求的具体信息，使用接口类型，以便于承载多种信息格式
}

// Response 结构体定义了返回包的格式
type Response struct {
	XMLName xml.Name    `xml:"Response"` // XML根元素名称
	PKType  PKType      `xml:"PK_Type"`  // PK类型信息
	Info    interface{} `xml:"Info"`     // 返回的具体信息，使用接口类型，允许承载多种信息格式
}

// PKType 定义了PK的名称和代码
type PKType struct {
	Name string `xml:"Name"` // PK的名称
}

// ParsePKType 用于解析XML格式数据，提取出PK的名称和代码
// 参数:
// - xmlData: 要解析的XML数据字符串
// 返回值:
// - name: 解析出的PK名称
// - code: 解析出的PK代码
// - 注意: 如果解析失败，name和code将返回空字符串
func (r *Request) ParsePKType(xmlData string) string {
	err := xml.Unmarshal([]byte(xmlData), r) // 将XML数据解析到Request结构体中
	if err != nil {
		fmt.Printf("Error unmarshaling XML: %v\n", err) // 打印解析错误信息
		return ""                                       // 解析失败时返回空字符串
	}
	return r.PKType.Name // 返回解析得到的PK名称和代码
}

// RespAck 总的响应结构体
type RespAck struct {
	FSUID        string `xml:"FSUID"`        // 设备唯一标识符
	Result       string `xml:"Result"`       // 设置结果
	FailureCause string `xml:"FailureCause"` // 设置失败原因
}

//***********************************************************************
// 业务报文解析
//***********************************************************************

// Login 定义 XML 结构体
type Login struct {
	XMLName  xml.Name `xml:"Info"` // 指定根标签名为 <Info>
	UserName string   `xml:"UserName"`
	PassWord string   `xml:"PassWord"`
	FSUID    string   `xml:"FSUID"`
	FSUIP    string   `xml:"FSUIP"`
	FSUMAC   string   `xml:"FSUMAC"`
	FSUVER   string   `xml:"FSUVER"`
}

// ParseXML 解析登录响应的XML报文
// 参数:
// - xmlData: 登录响应的XML字符串
// 返回值:
// - string: 解析后的登录确认信息的JSON字符串
func (p *Login) ParseXML(xmlData string) error {
	Request := Request{
		Info: p,
	}
	return xml.Unmarshal([]byte(xmlData), &Request)
}

// LoginAck  定义 XML 结构体
type LoginAck struct {
	XMLName      xml.Name `xml:"Info"`
	Result       string   `xml:"Result"`       // 如果为空，会生成 <Result></Result>
	FailureCause string   `xml:"FailureCause"` // 如果为空，会生成 <FailureCause></FailureCause>
}

// GenXML 生成登录确认信息的XML报文
// 返回值:
// - string: 生成的XML报文字符串
func (p *LoginAck) GenXML() string {
	response := Response{
		PKType: PKType{
			Name: "LOGIN_ACK",
		},
		Info: p,
	}
	return utils.GenXML(response)
}

// **********************************
// **********************************

// SendAlarm 结构体
type SendAlarm struct {
	XMLName xml.Name `xml:"Info"`
	FSUID   string   `xml:"FSUID"` // 虽然 XML 中 FSUID 是空的，但仍需定义字段
	Values  Values   `xml:"Values"`
}

// Values 结构体
type Values struct {
	TAlarmList TAlarmList `xml:"TAlarmList"`
}

// TAlarmList 结构体（包含多个 TAlarm）
type TAlarmList struct {
	TAlarms []TAlarm `xml:"TAlarm"` // 注意：XML 中有多个 <TAlarm>，所以用切片
}

// 单个 TAlarm 结构体
type TAlarm struct {
	SerialNo     string `xml:"SerialNo"`
	ID           string `xml:"ID"`
	DeviceID     string `xml:"DeviceID"`
	NMAlarmID    string `xml:"NMAlarmID"`
	AlarmTime    string `xml:"AlarmTime"`
	AlarmLevel   string `xml:"AlarmLevel"`
	AlarmFlag    string `xml:"AlarmFlag"`
	AlarmDesc    string `xml:"AlarmDesc"`
	EventValue   string `xml:"EventValue"` // 注意：XML 中 EventValue 没有标签名前缀，直接映射
	SignalNumber string `xml:"SignalNumber"`
	AlarmRemark  string `xml:"AlarmRemark"`
}

// ParseXML 解析XML 解析发送报警的 XML
// 参数:
// - xmlData: XML 数据字符串
// 返回值:
// - error: 如果解析成功，返回 nil；否则返回错误信息
func (p *SendAlarm) ParseXML(xmlData string) error {
	Request := Request{
		Info: p,
	}
	return xml.Unmarshal([]byte(xmlData), &Request)
}

// SendAlarmAck 结构体
type SendAlarmAck struct {
	XMLName      xml.Name `xml:"Info"`
	Result       string   `xml:"Result"`       // 对应 <Result/> 标签
	FailureCause string   `xml:"FailureCause"` // 对应 <FailureCause/> 标签
}

// 生成发送报警确认信息的XML报文
// 返回值:
// - string: XML报文字符串
func (p *SendAlarmAck) GenXML() string {
	response := Response{
		PKType: PKType{
			Name: "SEND_ALARM_ACK",
		},
		Info: p,
	}
	return utils.GenXML(response)
}
